package jzoffer;

import java.util.HashMap;
import java.util.Map;

/**
 * 1. 找到所有状态
 * 2.画出状态转移图
 * 3.定义状态转移表
 * 4.确定合法的终止状态
 * 5.初始化状态为0
 * 6.遍历所有的字符，判断字符类型，从当前状态表的Map中，判断当前是否包含当前类型的key，如果包含说明可以转移到下一个状态，即map.get(t)
 * 7.如果转移到下一个状态，则继续判断下一个字符；否则返回false
 * 8.最后判断最终状态是否为合法状态
 * @author MaoLin Wang
 * @date 2020/10/7 11:04 上午
 */
public class 表示数值的字符串 {
        public boolean isNumber(String s) {
            Map[] states = {
                    new HashMap() {{ put(' ', 0); put('s', 1); put('d', 2); put('.', 4); }}, // 0.
                    new HashMap() {{ put('d', 2); put('.', 4); }},                           // 1.
                    new HashMap() {{ put('d', 2); put('.', 3); put('e', 5); put(' ', 8); }}, // 2.
                    new HashMap() {{ put('d', 3); put('e', 5); put(' ', 8); }},              // 3.
                    new HashMap() {{ put('d', 3); }},                                        // 4.
                    new HashMap() {{ put('s', 6); put('d', 7); }},                           // 5.
                    new HashMap() {{ put('d', 7); }},                                        // 6.
                    new HashMap() {{ put('d', 7); put(' ', 8); }},                           // 7.
                    new HashMap() {{ put(' ', 8); }}                                         // 8.
            };
            int p = 0;
            char t;
            for(char c : s.toCharArray()) {
                if(c >= '0' && c <= '9') t = 'd';
                else if(c == '+' || c == '-') t = 's';
                else if(c == 'e' || c == 'E') t = 'e';
                else if(c == '.' || c == ' ') t = c;
                else t = '?';
                if(!states[p].containsKey(t)) return false;
                p = (int)states[p].get(t);
            }
            return p == 2 || p == 3 || p == 7 || p == 8;
        }

}
